package com.spark.common.utils;

import com.spark.common.core.entity.generation.GenModelFields;
import com.spark.common.core.entity.generation.vo.CreateModelVo;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 创建表工具类
 *
 * @author LYCHEE
 * @date 2025/2/25 14:20
 */
public class CreateTableUtils {


    /**
     * 创建表Sql
     * @param tableModel 创建表参数
     * @return SQL
     */
    public static String createTableSql(CreateModelVo tableModel){
        StringBuilder createTableSql = new StringBuilder("CREATE TABLE `").append(tableModel.getModelCode()).append("` (").append("\n");
        // 添加主键和其他字段
        List<GenModelFields> columns = tableModel.getFields();
        for (int i = 0; i < columns.size(); i++) {
            if (i > 0) {
                createTableSql.append(", ").append("\n");
            }
            createTableSql.append(buildColumnDefinition(columns.get(i)));
        }
        // 检查并添加主键约束
        List<String> primaryKeyFields = columns.stream()
                .filter(GenModelFields::getFieldPrimaryKey)
                .map(GenModelFields::getFieldName).collect(Collectors.toList());

        if (!primaryKeyFields.isEmpty()) {
            createTableSql.append(", ").append("\n").append("PRIMARY KEY (");
            for (int i = 0; i < primaryKeyFields.size(); i++) {
                if (i > 0) {
                    createTableSql.append(", ");
                }
                createTableSql.append("`").append(primaryKeyFields.get(i)).append("`");
            }
            createTableSql.append(")").append("\n");
        }

        // 检查并添加唯一约束
        List<String> uniqueFields = columns.stream()
                .filter(GenModelFields::getFieldUnique)
                .map(GenModelFields::getFieldName).collect(Collectors.toList());

        if (!uniqueFields.isEmpty()) {
            createTableSql.append(", ").append("\n").append("UNIQUE KEY (");
            for (int i = 0; i < uniqueFields.size(); i++) {
                if (i > 0) {
                    createTableSql.append(", ");
                }
                createTableSql.append("`").append(uniqueFields.get(i)).append("`");
            }
            createTableSql.append(")").append("\n");
        }

        // 添加表注释
        createTableSql.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='")
                .append(tableModel.getModelName())
                .append("'");
        return createTableSql.toString();
    }

    /**
     * 构建单个字段的定义
     * @param columnDefinition 字段定义对象
     * @return 字段定义的SQL片段
     */
    private static String buildColumnDefinition(GenModelFields columnDefinition) {
        StringBuilder columnSql = new StringBuilder();

        columnSql.append("`").append(columnDefinition.getFieldName()).append("` ");

        // 字段类型
        columnSql.append(columnDefinition.getFieldType());

        // 字段长度
        // 排除 DATE 和 TIME 类型的字段长度定义
        if (!columnDefinition.getFieldType().equalsIgnoreCase("DATE")
                && !columnDefinition.getFieldType().equalsIgnoreCase("TIME")
                && !columnDefinition.getFieldType().equalsIgnoreCase("TEXT")
                && !columnDefinition.getFieldType().equalsIgnoreCase("LONGTEXT")) {

            // 字段长度
            if (columnDefinition.getFieldLength() != null) {
                columnSql.append("(").append(columnDefinition.getFieldLength());
                if (columnDefinition.getFieldDecimalPoint() != null && 0 != columnDefinition.getFieldDecimalPoint()) {
                    columnSql.append(", ").append(columnDefinition.getFieldDecimalPoint());
                }
                columnSql.append(")");
            }
        }

        // 默认值
        if (StringUtils.isNotEmpty(columnDefinition.getFieldDefaultVal())) {
            columnSql.append(" DEFAULT '").append(columnDefinition.getFieldDefaultVal()).append("'");
        }

        // 是否允许NULL
        if (columnDefinition.getFieldNotNull() != null && columnDefinition.getFieldNotNull()) {
            columnSql.append(" NOT NULL");
        } else {
            columnSql.append(" NULL");
        }

        // 字段注释
        if (columnDefinition.getFieldAnnotation() != null) {
            if (StringUtils.isNotEmpty(columnDefinition.getFieldRemark())){
                columnSql.append(" COMMENT '").append(columnDefinition.getFieldAnnotation()).append(" (")
                        .append(columnDefinition.getFieldRemark()).append(")'");
            }else {
                columnSql.append(" COMMENT '").append(columnDefinition.getFieldAnnotation()).append("'");
            }
        }
        return columnSql.toString();
    }
}
